<?php
namespace core\models;
/**
 * Memcache方式的缓存
 * Class Cache_Memcache
 * 【注意】此类已经在Cache::open()中被调用，不用直接new。
 * @author ZhouHaoHua <53027327@qq.com>
 */
class Cache_Memcache extends \Memcache implements Interface_Cache{
    /**
     * 本类总开关
     * @var bool false为关，true为开
     */
    private static $Switch = true;
    /**
     * key标签头
     * @var string
     */
    private $key_life_tag;

    public function __construct () {
        $this->key_life_tag = Z_APP . Z_TOP_WWW;
        $config = new \config();
        $cw          = $config->cache();//Z_ENV
        //添加缓存服务器
        foreach($cw->Memcached as $k => $v){
            $this->addserver($v['host'], $v['port'], true, $v['weight']);
        }
    }

    /**
     * 增加一个条目到缓存
     * @param string $key 将要分配给变量的key
     * @param        $var 将要被存储的变量值。
     * @param int    $flag 使用MEMCACHE_COMPRESSED标记对数据进行压缩(使用zlib)
     * @param int    $expire 有效期秒。
     *
     * @return bool 成功时返回 true， 或者在失败时返回 false。 如果这个key已经存在返回false。
     */
    public function add ($key, $var, $flag = MEMCACHE_COMPRESSED, $expire = 2592000) {
        if(!self::$Switch) return false;
        $key .= $this->key_life_tag;
        $expire = (int)$expire;
        return parent::add(md5($key), $var, $flag, $expire);
    }

    /**
     * 保存数据到缓存
     * @param string $key 将要分配给变量的key
     * @param        $var 将要被存储的变量。
     * @param int    $flag 使用MEMCACHE_COMPRESSED标记对数据进行压缩(使用zlib)
     * @param int    $expire 有效期秒。
     *
     * @return bool 成功时返回 true， 或者在失败时返回 false。 如果这个key已经存在返回false。
     */
    public function set ($key, $var, $flag = 0, $expire = 2592000) {
        if(!self::$Switch) return false;
        $key .= $this->key_life_tag;
        return parent::set(md5($key), $var, $flag, $expire);
    }

    /**
     * 取得一条缓存数据
     * @param string $key 要获取值的key
     * @param bool   $flags
     * @return int|mixed|string
     */
    public function get ($key, &$flags = false) {
        if(!self::$Switch) return false;
        $key .= $this->key_life_tag;
        $data = parent::get(md5($key), $flags);
        return $data;
    }

    /**
     * 替换一条缓存记录
     * @param string $key 要替换的key
     * @param        $var 新值
     * @param int    $flag 使用MEMCACHE_COMPRESSED标记对数据进行压缩(使用zlib)
     * @param int    $expire $expire 有效期秒
     *
     * @return bool
     */
    public function replace ($key, $var, $flag = 0, $expire = 2592000) {
        if(!self::$Switch) return false;
        $key .= $this->key_life_tag;
        return parent::replace(md5($key), $var, $flag, $expire);
    }

    /**
     * 删除一条缓存记录
     * @param     $key
     * @param int $timeout 删除该元素的超时时间。
     *
     * @return bool
     */
    public function delete ($key, $timeout = 0) {
        $key .= $this->key_life_tag;
        return parent::delete(md5($key), $timeout);
    }
    public function increment ($key, $value = 1 ){
        $key .= $this->key_life_tag;
        return parent::increment(md5($key), $value);
    }
    public function decrement ($key ,$value = 1){
        $key .= $this->key_life_tag;
        return parent::decrement(md5($key), $value);
    }

    /**
     * 取得当前缓存的类型名称
     * @return string
     */
    public function getType() {
        return 'Memcache';
    }
}
